package com.sourcetrip.my.inter;


import com.sourcetrip.my.modle.TreeNode;
import com.sourcetrip.utils.Visitor;
import com.sourcetrip.utils.printer.BinaryTreeInfo;

/**
 * @author: ZhouBert
 * @date: 2020/12/14
 * @description:	二叉树接口
 */
public interface BinaryTree<E> extends BinaryTreeInfo {
	/**
	 * 二叉树容量
	 * @return
	 */
	int size();

	boolean isEmpty();

	void clear();

	/**
	 * 添加元素
	 * @param element
	 */
	void add(E element);

	/**
	 * 删除元素
	 * @param element
	 */
	void remove(E element);

	/**
	 * 是否包含 元素
	 * @param element
	 * @return
	 */
	boolean contains(E element);

	/**
	 * 查找节点
	 * @param element
	 * @return
	 */
	TreeNode<E> node(E element);

	/**
	 * 判断是否为完全二叉树
	 * LeetCode 958
	 * @return
	 */
	boolean isComplete();

	/**
	 * 获取树的高度
	 * @return
	 */
	int height();

	/**
	 * 获取 node 的前驱节点
	 * @param node
	 * @return
	 */
	TreeNode<E> predecessor(TreeNode<E> node);

	/**
	 * 获取 node 的后继节点
	 * @param node
	 * @return
	 */
	TreeNode<E> successor(TreeNode<E> node);

	//region	order - 遍历

	/**
	 * 前序遍历
	 * 默认从本节点的根节点
	 * @param visitor
	 */
	void preorder(Visitor<E> visitor);

	/**
	 * 中序遍历
	 * 默认从本节点的根节点
	 * @param visitor
	 */
	void inorder(Visitor<E> visitor);

	/**
	 * 后序遍历
	 * 默认从本节点的根节点
	 * @param visitor
	 */
	void postorder(Visitor<E> visitor);

	/**
	 * 层序遍历
	 * @param visitor
	 */
	void levelOrder(Visitor<E> visitor);

	//endregion





}
